# 元组
print('#' * 15 + '元组' + '#' * 15)
"""
Python 的元组与列表类似，不同之处在于元组的元素不能修改。
元组使用小括号，列表使用方括号。
元组创建很简单，只需要在括号中添加元素，并使用逗号隔开即可。
"""
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5)
tup3 = "a", "b", "c", "d"
print(type(tup1), type(tup2), type(tup3))
tup1 = ()  # 创建空元组
print(type(tup1))
tup1 = (50)  # 不加逗号，类型为整型
print(type(tup1))
tup1 = (50, )  # 加上逗号，类型为元组
print(type(tup1))


# 访问元组
print('#' * 15 + '访问元组' + '#' * 15)
"""
元组与字符串类似，下标索引从0开始，可以进行截取，组合等。
"""
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7)
print("tup1[0]: ", tup1[0])
print("tup2[1:5]: ", tup2[1:5])


# 修改元组
print('#' * 15 + '修改元组' + '#' * 15)
"""
元组中的元素值是不允许修改的，但我们可以对元组进行连接组合
"""
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')

# 以下修改元组元素操作是非法的。
# tup1[0] = 100

# 创建一个新的元组
tup3 = tup1 + tup2
print(tup3)


# 删除元组
"""
元组中的元素值是不允许删除的，但我们可以使用del语句来删除整个元组

tup = ('Google', 'Runoob', 1997, 2000)
print (tup)
del tup
print ("删除后的元组 tup : ")
print (tup)
>>> 删除后的元组 tup : 
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print (tup)
NameError: name 'tup' is not defined
"""


# 元组运算符
print('#' * 15 + '元组运算符' + '#' * 15)
"""
与字符串一样，元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制，运算后会生成一个新的元组
"""
print(len((1, 2, 3)))  # => 3 => 计算元素个数
print((1, 2, 3) + (4, 5, 6))  # => (1, 2, 3, 4, 5, 6) => 连接
print(('Hi!',) * 4)  # => ('Hi!', 'Hi!', 'Hi!', 'Hi!') => 复制
print(3 in (1, 2, 3))  # => True => 元素是否存在
for x in (1, 2, 3):  # => 1 2 3 => 迭代
    print(x, end=" ")
print()


# 元组索引，截取
print('#' * 15 + '元组索引，截取' + '#' * 15)
"""
因为元组也是一个序列，所以我们可以访问元组中的指定位置的元素，也可以截取索引中的一段元素
"""
L = ('Google', 'Taobao', 'Runoob')
print(L[2])  # => 'Runoob' => 读取第三个元素
print(L[-2])  # => 'Taobao' => 反向读取，读取倒数第二个元素
print(L[1:])  # => ('Taobao', 'Runoob')' => 截取元素，从第二个开始后的所有元素。


# 元组内置函数
print('#' * 15 + '元组内置函数' + '#' * 15)
"""
序号      方法              描述
1       len(tuple)      计算元组元素个数。	
2	    max(tuple)      返回元组中元素最大值。	
3	    min(tuple)      返回元组中元素最小值。	
4	    tuple(iterable) 将可迭代系列转换为元组。
"""
tuple1 = ('Google', 'Runoob', 'Taobao')
print(len(tuple1))
tuple2 = ('5', '4', '8')
print(max(tuple2))
print(min(tuple2))
list1 = ['Google', 'Taobao', 'Runoob', 'Baidu']
print(tuple(list1))


# 关于元组是不可变的
print('#' * 15 + '元组是不可变的' + '#' * 15)
"""
所谓元组的不可变指的是元组所指向的内存中的内容不可变。
重新赋值的元组 tup，绑定到新的对象了，不是修改了原来的对象。
"""
tup = ('r', 'u', 'n', 'o', 'o', 'b')
# tup[0] = 'g'      不支持修改元素
print(id(tup))     # 查看内存地址
tup = (1, 2, 3)
print(id(tup))      # 内存地址不一样了
